#pragma once

#include <boost/asio.hpp>
#include <memory>
#include <string>
#include <functional>
#include "tcp_session.hpp"

using boost::asio::ip::tcp;

/**
 * @brief TCP服务器类
 * 
 * 负责监听指定地址和端口，接受新的客户端连接
 * 使用异步操作处理连接请求
 */
class TcpServer {
public:
    /**
     * @brief 连接建立时的回调函数类型
     */
    using ConnectionCallback = std::function<void(std::shared_ptr<TcpSession>)>;

    /**
     * @brief 构造函数
     * @param io_context Boost.Asio IO上下文
     * @param address 服务器监听地址
     * @param port 服务器监听端口
     * @param connection_callback 连接建立时的回调函数
     */
    TcpServer(boost::asio::io_context& io_context, 
              const std::string& address, 
              unsigned short port,
              IMessageReceiver& message_receiver,
              ConnectionCallback connection_callback = nullptr);

    /**
     * @brief 启动服务器
     * 开始接受新的客户端连接
     */
    void start();

    /**
     * @brief 停止服务器
     * 关闭监听器，停止接受新的连接
     */
    void stop();

private:
    /**
     * @brief 异步接受新的客户端连接
     * 当有新连接时，创建新的会话对象并开始处理
     */
    void do_accept();

    boost::asio::io_context& io_context_;    ///< Boost.Asio IO上下文引用
    tcp::acceptor acceptor_; ///< TCP接受器，用于接受新的连接
    ConnectionCallback connection_callback_; ///< 连接建立时的回调函数
    IMessageReceiver& message_receiver_; ///< 消息接收器
};